package modelo.bd.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import modelo.bd.exception.DAOException;
import modelo.dominio.Documento;
import modelo.servicio.Documentos;
import modelo.servicio.Historicos;
import modelo.servicio.Secciones;

public class DocumentoDAO extends AbstractDAO<Documento> {

    @Override
    public void add(Documento entity) throws DAOException {
        try {
            /*
             * PROCEDURE [dbo].[SSMA_ALTER_DOCUMENTO_P] @ACCION varchar(1),
             * @USUARIO varchar(25), @CLAVE_DOC varchar(22), @FOLIO varchar(4),
             * @RUTA varchar(200), @ID_SECCION int, @DESCRIPCION varchar(300),
             * @TIPO_DOC varchar(4), @LUGAR_FISICO varchar(200), @ESTADO
             * varchar(2), @PRECEDENTE VARCHAR(22)
             */
            String query = "EXEC SSMA_ALTER_DOCUMENTO_P ";
            query += "'I'";
            query += ", '" + entity.getHistorico().getUsuarioCrea() + "'";
            query += ", '" + entity.getClave() + "'";
            query += ", '" + entity.getFolio() + "'";
            query += ", '" + entity.getRuta() + "'";
            query += ", " + entity.getSeccion().getIdSeccion();
            query += ", '" + entity.getDescripcion() + "'";
            query += ", '" + entity.getTipoDoc() + "'";
            query += ", '" + entity.getLugarFisico() + "'";
            query += ", 'CR'";
            query += ", " + (entity.getPrecedente() == null ? "NULL" : ("'" + entity.getPrecedente() + "'"));
            this.setQuery(query);
            con.ejecutarActualizacion(getQuery());
        } catch (SQLException ex) {
            throw new DAOException("Error en DAO Documento " + ex.getMessage());
        }
    }

    @Override
    public void deleteWhere(String condition) throws DAOException {
        try {
            String query = "UPDATE SSMA_HISTORICO_T SET ESTADO = 'IN' WHERE ID_HISTORICO IN ";
            query += " (SELECT ID_HISTORICO FROM SSMA_DOCUMENTOS_T WHERE " + condition + ")";
            this.setQuery(query);
            con.ejecutarActualizacion(getQuery());
        } catch (SQLException ex) {
            throw new DAOException("Error en DAO Documento " + ex.getMessage());
        }
    }

    @Override
    public void update(Documento entity) throws DAOException {
        try {
            /*
             * PROCEDURE SSMA_ALTER_DOCUMENTOS_P --ARGUMENTOS POR DEFECTO
             * @ACCION VARCHAR(1), @USUARIO VARCHAR(25), --ARGUMENTOS DE LA
             * TABLA @CLAVE_DOC VARCHAR(22), @FOLIO VARCHAR(4), @RUTA
             * VARCHAR(200), @ID_SECCION INT, @ID_ESTUDIO VARCHAR(150),
             * @DESCRIPCION VARCHAR(300), @TIPO_DOC VARCHAR(4), @LUGAR_FISICO
             * VARCHAR(200), @ESTADO VARCHAR(1)
             */
            String query = "EXEC SSMA_ALTER_DOCUMENTO_P ";
            query += "'U'";
            query += ", '" + entity.getHistorico().getUsuarioCrea() + "'";
            query += ", '" + entity.getClave() + "'";
            query += ", '" + entity.getFolio() + "'";
            query += ", '" + entity.getRuta() + "'";
            query += ", " + entity.getSeccion().getIdSeccion();
            query += ", '" + entity.getDescripcion() + "'";
            query += ", '" + entity.getTipoDoc() + "'";
            query += ", '" + entity.getLugarFisico() + "'";
            query += ", '"+ entity.getHistorico().getEstado()+"'";
            query += ", " + (entity.getPrecedente() == null ? "NULL" : ("'" + entity.getPrecedente() + "'"));
            this.setQuery(query);
            con.ejecutarActualizacion(getQuery());
        } catch (SQLException ex) {
            throw new DAOException("Error en DAO Documento " + ex.getMessage());
        }
    }

    @Override
    protected ArrayList<Documento> select() throws DAOException {
        try {
            ResultSet resultado = con.ejecutarConsulta(getQuery());
            ArrayList<Documento> docs = new ArrayList();
            while (resultado.next()) {
                Documento doc = new Documento();
                doc.setClave(resultado.getString("CLAVE_DOC"));
                doc.setFolio(resultado.getString("FOLIO"));
                doc.setTipoDoc(resultado.getString("TIPO_DOC"));
                doc.setRuta(resultado.getString("RUTA"));
                doc.setDescripcion(resultado.getString("DESCRIPCION"));
                doc.setLugarFisico(resultado.getString("LUGAR_FISICO"));
                doc.setHistorico(Historicos.instancia().obtenerPorId(resultado.getInt("ID_HISTORICO")));
                doc.setSeccion(Secciones.instancia().obtenerPorId(resultado.getInt("ID_SECCION")));
                if (resultado.getString("PRECEDENTE") != null) {
                    doc.setPrecedente(Documentos.instancia().obtenerPorId(resultado.getString("PRECEDENTE")));
                }
                docs.add(doc);
            }
            return docs;
        } catch (SQLException ex) {
            throw new DAOException("Error en DAO Documento " + ex.getMessage());
        }
    }

    @Override
    public ArrayList<Documento> selectAll() throws DAOException {
        this.setQuery("SELECT * FROM SSMA_DOCUMENTOS_T WHERE ID_HISTORICO NOT IN (SELECT ID_HISTORICO FROM SSMA_HISTORICO_T WHERE ESTADO = 'IN')");
        return select();
    }

    @Override
    public ArrayList<Documento> selectWhere(String condition) throws DAOException {
        String query = "SELECT * FROM SSMA_DOCUMENTOS_T WHERE (" + condition + ")";
        query += " AND ID_HISTORICO NOT IN (SELECT ID_HISTORICO FROM SSMA_HISTORICO_T WHERE ESTADO = 'IN')";
        this.setQuery(query);
        return select();
    }

    public int selectCount(Integer seccion) throws DAOException {
        try {
            this.setQuery("SELECT COUNT(1) AS CUENTA FROM SSMA_DOCUMENTOS_T WHERE ID_SECCION = " + seccion + " AND ID_HISTORICO NOT IN (SELECT ID_HISTORICO FROM SSMA_HISTORICO_T WHERE ESTADO = 'IN')");
            ResultSet resultado = con.ejecutarConsulta(getQuery());
            if (resultado.next()) {
                return resultado.getInt("CUENTA");
            } else {
                return 0;
            }
        } catch (SQLException ex) {
            throw new DAOException("Error en DAO Documento " + ex.getMessage());
        }
    }

    public ArrayList<Documento> selectPag(int desde, int hasta, Integer seccion) throws DAOException {
        this.setQuery("SELECT * FROM ("
                + " SELECT ROW_NUMBER()"
                + " OVER(ORDER BY CLAVE_DOC) AS LINEA,"
                + " SDT.*"
                + " FROM SSMA_DOCUMENTOS_T SDT"
                + " WHERE ID_SECCION = " + seccion
                + " AND ID_HISTORICO NOT IN (SELECT ID_HISTORICO FROM SSMA_HISTORICO_T WHERE ESTADO = 'IN')"
                + ") A"
                + " WHERE A.LINEA BETWEEN " + desde
                + " AND " + hasta);
        return this.select();

    }

    public String selectNextFolio(String tipoDoc, Integer area) throws DAOException {
        try {
            this.setQuery("{call SSMA_PROX_FOLIO_P('" + tipoDoc.trim() + "'," + area + ")}");
            ResultSet resultado = con.ejecutarStored(getQuery());
            resultado.next();
            return resultado.getString("FOLIO");
        } catch (SQLException ex) {
            throw new DAOException("Error en DAO Documento " + ex.getMessage());
        }
    }
}